module klang.json.语法节点.json节点_;
import 全局;
import 节点 = klang.编译.语法节点.节点_;
import klang.编译.类型.枚举值.枚举值_: SK, TK;
import klang.编译.核心.核心_: 整数_;
alias Json令牌语法_ = JSK;
alias 表达式_ = Json节点_;
alias 语句_ = Json节点_;
enum JSK : long {
    未知__ = 0L,
    真_ = 1L,
    假_ = 2L,
    空值_ = 3L,
    文本字面量 = 4L,
    数字字面量 = 5L,
    小数字字面量 = 6L,
    数组字面量 = 7L,
    对象字面量 = 8L,
    一元前缀表达式 = 9L,
    属性赋值表达式 = 10L,
    表达式语句 = 11L,
    源文件 = 12L
}
class Json节点_ : 节点.前端节点_ {
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        super(TK.Json, tsk, 开始, 结束);
        this.目标 = TK.Json;
        this.目标种类 = tsk;
    }
}
class Json令牌_(K) : Json节点_ {
    this() { }
    this(K tsk, long 开始 = -1, long 结束 = -1) {
        super(tsk, 开始, 结束);
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = tsk;
    }
}
class 字面量类_ : Json节点_ {
    dstring 内容;
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = tsk;
        this.内容 = ··null!(dstring);
    }
}
class 文本字面量_ : 字面量类_ {
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = tsk;
        this.内容 = ··null!(dstring);
    }
}
class 数字字面量_ : 字面量类_ {
    long 值;
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = tsk;
        this.内容 = ··null!(dstring);
        this.值 = ··null!(long);
    }
}
class 小数字字面量_ : 字面量类_ {
    double 值;
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = tsk;
        this.内容 = ··null!(dstring);
        this.值 = ··null!(double);
    }
}
class 数组字面量_ : Json节点_ {
    节点.节点数组_!(Json节点_) 元素组;
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        super(tsk, 开始, 结束);
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = tsk;
        this.元素组 = ··null!(节点.节点数组_!(Json节点_));
    }
}
class 对象字面量_ : Json节点_ {
    节点.节点数组_!(Json节点_) 元素组;
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        super(tsk, 开始, 结束);
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = tsk;
        this.元素组 = ··null!(节点.节点数组_!(Json节点_));
    }
}
class 一元前缀表达式_ : Json节点_ {
    字面量类_ 表达式;
    SK 运算符;
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        super(tsk, 开始, 结束);
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = tsk;
        this.表达式 = ··null!(字面量类_);
        this.运算符 = SK.减号;
    }
}
class Json源文件_ : 节点.源文件_ {
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        super(TK.Json, tsk, 开始, 结束);
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = JSK.源文件;
    }
}
class 表达式语句_ : Json节点_ {
    Json节点_ 表达式;
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        super(tsk, 开始, 结束);
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = tsk;
        this.表达式 = ··null!(Json节点_);
    }
}
class 属性赋值表达式_ : Json节点_ {
    dstring 名称;
    Json节点_ 表达式;
    this() { }
    this(JSK tsk, long 开始 = -1, long 结束 = -1) {
        super(tsk, 开始, 结束);
        this.种类 = SK.目标;
        this.目标 = TK.Json;
        this.目标种类 = tsk;
        this.名称 = ··null!(dstring);
        this.表达式 = ··null!(Json节点_);
    }
}
T 创建节点(T)(JSK tsk, long 开始 = -1, long 结束 = -1) {
    switch (tsk) {
        case JSK.真_:
        case JSK.假_:
        case JSK.空值_: {
            Json令牌_!(JSK) n = new Json令牌_!(JSK)(tsk, 开始, 结束);
            return (cast(T)(n));
        }
        case JSK.源文件: {
            Json源文件_ n = new Json源文件_(tsk, 开始, 结束);
            return (cast(T)(n));
        }
        case JSK.表达式语句: {
            表达式语句_ n = new 表达式语句_(tsk, 开始, 结束);
            return (cast(T)(n));
        }
        case JSK.文本字面量: {
            文本字面量_ n = new 文本字面量_(tsk, 开始, 结束);
            return (cast(T)(n));
        }
        case JSK.数字字面量: {
            数字字面量_ n = new 数字字面量_(tsk, 开始, 结束);
            return (cast(T)(n));
        }
        case JSK.小数字字面量: {
            小数字字面量_ n = new 小数字字面量_(tsk, 开始, 结束);
            return (cast(T)(n));
        }
        case JSK.数组字面量: {
            数组字面量_ n = new 数组字面量_(tsk, 开始, 结束);
            return (cast(T)(n));
        }
        case JSK.对象字面量: {
            对象字面量_ n = new 对象字面量_(tsk, 开始, 结束);
            return (cast(T)(n));
        }
        case JSK.一元前缀表达式: {
            一元前缀表达式_ n = new 一元前缀表达式_(tsk, 开始, 结束);
            return (cast(T)(n));
        }
        case JSK.属性赋值表达式: {
            属性赋值表达式_ n = new 属性赋值表达式_(tsk, 开始, 结束);
            return (cast(T)(n));
        }
        default: break;
    }
    return (cast(T)(new Json节点_(tsk, 开始, 结束)));
}
